import java.util.ArrayList;

public class RotationTerre {
	
	private Vecteur axeT, 						// vecteur directeur de l'axe terrestre
				   haut, sud, ouest,		 	// repere du cadran dans le repere solaire
				   d;							// vecteur directeur des rayons solaires
	private Point3D style;						// position de la pointe du style dans le repere du cadran
	private double angleS = 360./(365.*24.),		// angle de rotation Terre-Soleil
				  angleT = 360.*(86400./86164)/24.,	// angle de rotation Terre sur elle-meme
				  obliquite = 23.27;			
	private Matrice rotationTT,					// matrice de rotation de la Terre sur elle-meme 
					rotationTS;					// matrice de rotation de la Terre autours du Soleil
	private ArrayList<Facette> surface = new ArrayList<Facette>();
	
	/** Cree un systeme Cadran-Terre-Soleil initialise au solstice d'ete
	 * @param latitude la latitude du cadran solaire
	 * @param positionStyle la position du style dans le repere du cadran */
	public RotationTerre(double latitude, Point3D positionStyle) {
		style = positionStyle;
		// initialisation du repere du cadran et de l'axe terrestre
		axeT = new Vecteur(0,0,1);
		haut = new Vecteur(-1,0,0);
		ouest = new Vecteur(0,-1,0);
		sud = new Vecteur(0,0,-1);
		d = new Vecteur(1,0,0);
		// application de l'obliquite et de la latitude
		axeT = axeT.rotationY(-obliquite);
		haut = haut.rotationY(-obliquite+latitude);
		ouest = ouest.rotationY(-obliquite+latitude);
		sud = sud.rotationY(-obliquite+latitude);
		// initialisation de la matrice de rotation de la Terre autours du soleil
		rotationTS = Matrice.rotationM(new Vecteur(0,0,1),-angleS);
	}
	
	/** Met a jour l'ensemble du systeme apres une heure */
	public void next() {
		//rotation de l'axe terrestre
		axeT = axeT.applique(rotationTS);
		// rotation du cadran
		rotationTT = Matrice.rotationM(axeT,angleT);
		haut = haut.applique(rotationTS);
		ouest = ouest.applique(rotationTS);
		sud = sud.applique(rotationTS);
		haut = haut.applique(rotationTT);
		ouest = ouest.applique(rotationTT);
		sud = sud.applique(rotationTT);
	}
	
	/** Calcul la position de l'ombre sur le cadran solaire a l'instant courant */
	public Point3D projection() {
		Vecteur d_f = d.applique(Matrice.passageM(sud,ouest,haut));
		Point3D ombre = null;
		for(int i=0;i<surface.size();i++) {
			ombre = surface.get(i).projete(style,d_f);
			if(ombre!=null) { return ombre;}
		} 
		return null;
		/*double k = -style.z/d_f.get(3),
			   x = k*d_f.get(1) + style.x,
			   y = k*d_f.get(2) + style.y;
		if(k<0) return null;
		return new Point3D(x,y,0.);*/
	}
	
	/** Ajoute une facette au cadran solaire */
	public void ajouterFacette(Facette f) { surface.add(f);}
	
	/** Renvoie la position du style
	 * @return la position de la pointe du style */
	public Point3D getStyle() { return style; }
	
	
}